CD2001C – Analítica para Negocios: De Los Datos a las Decisiones Febrero – Junio 2024
Explorar, definir, y describir cuáles son los principales factores del clima organizacional de FORM que propician la satisfacción y/o no satisfacción de trabajar en dicha empresa.
La rotación de personal se ha identificado como el desafío más crítico que enfrenta FORM en el presente. A pesar de nuestros esfuerzos continuos para crear un ambiente laboral atractivo y retener a nuestros valiosos empleados, nos encontramos con una tasa de rotación especialmente alta entre los operadores. Este fenómeno no solo afecta la continuidad y la eficiencia de nuestras operaciones, sino que también incrementa los costos asociados con el reclutamiento y la capacitación de nuevo personal.
Explorar, desarrollar, y describir la(s) posible(s) estrategia(s) de predicción de la demanada de productos fabricados por la empresa FORM.
La predicción precisa de la demanda representa un desafío igualmente significativo para FORM, dada la variabilidad inherente en la producción y venta de autopartes. La habilidad para anticipar con exactitud cuántas unidades de un determinado componente serán necesarias es crucial para optimizar nuestros procesos de producción y empaque, y para asegurar que se maximice la eficiencia en el uso de recursos.
A partir de las diferentes bases de datos compartidas por la empresa FORM y las industrias relacionadas con dicha empresa, seleccionar al menos 1 situación problema y elaborar lo siguiente:
library(imputeTS)
library(xts)
library(zoo)
library(tseries)
library(stats)
library(forecast)
library(astsa)
library(corrplot)
library(wordcloud)
library(tidytext)
library(AER)
library(vars)
library(dynlm)
library(mFilter)
library(TSstudio)
library(tidyverse)
library(sarima)
library(readr)
library(readxl)
library(heatmaply)
library(dplyr)
library(ggplot2)
library(psych)
library(tidyr)
library(readtext)
library(syuzhet)
library(RColorBrewer)
library(tm)
library(caret)
library(MASS)
library(rpart)
library(rpart.plot)
library(party)
library(gmodels)
library(knitr)
library(cluster)
library(e1071)
library(pROC)
library(ISLR)
library(gridExtra)
library(car)
library(DataExplorer)
library(randomForest)
library(class)
library(factoextra)
library(purrr)
Elaborar 4-6 preguntas relacionadas con la situación problema seleccionada que se puedan responder mediante el análisis de datos.
Situación Problema 1: Rotación de Personal - ¿Qué está causando la rotación de personal tan alta? - ¿Existe algún momento del año donde se den más bajas dentro de la empresa? - ¿Cómo se siente la gente dentro de su trabajo actual? - ¿Qué factor ayuda a que el personal dure más tiempo dentro de la empresa? - ¿En qué parte de la empresa el trabajador se siente más inconforme y cuál es su perfil?
Situación Problema 2: Predicción de Demanda - ¿Cuáles son los patrones históricos de demanda de empaques de cartón para autopartes en los mercados objetivo de la empresa FORM, y cómo varían estos patrones según la temporada, el tipo de autoparte, y las regiones geográficas? - ¿Cómo impactan los lanzamientos de nuevos modelos de vehículos y las tendencias en la industria automotriz en la demanda de diferentes tipos de empaques de cartón para autopartes? - ¿Cuál ha sido el efecto de las campañas de marketing y las actividades promocionales de la empresa FORM sobre la demanda de sus productos en el pasado? - ¿Cómo impactan algunas variables externas de carácter macroeconómico a las ventas de la empresa?
En un mundo empresarial cada vez más globalizado y competitivo, las organizaciones buscan constantemente estrategias innovadoras para optimizar sus operaciones y mantenerse a la vanguardia de sus respectivas industrias. Una de estas estrategias que ha ganado protagonismo en los últimos años es el “Nearshoring”, un enfoque de outsourcing que consiste en delegar actividades y servicios a proveedores ubicados en países geográficamente cercanos. En este contexto, México emerge como un destino atractivo para el “Nearshoring”, gracias a su ubicación estratégica, recurso humano capacitado y condiciones económicas favorables.
México tiene una ubicación geográfica privilegiada, compartiendo fronteras con Estados Unidos y siendo parte del Tratado de Libre Comercio de América del Norte (TLCAN), hoy T-MEC, lo que facilita el acceso a uno de los mercados más grandes y dinámicos. del mundo. Esta proximidad geográfica no sólo reduce los costos y tiempos de transporte, sino que también facilita la comunicación y colaboración en tiempo real entre las empresas matrices y sus socios de nearshoring. Además, México ha establecido una red de acuerdos comerciales que brindan ventajas arancelarias y facilitan el flujo de bienes, brindando una plataforma atractiva para operaciones de subcontratación.
El país también cuenta con una fuerza laboral altamente calificada y diversificada, que va desde ingenieros y profesionales de tecnología hasta expertos en manufactura y servicios financieros. Los costos laborales en México son competitivos en comparación con otros destinos de subcontratación, lo que permite a las empresas obtener mayor valor agregado a un menor costo. Además, el continuo crecimiento en educación y formación ha impulsado la formación de profesionales altamente cualificados, lo que garantiza la disponibilidad del talento necesario para cubrir las demandas del “Nearshoring”. Todo esto ha hecho que en los últimos años México haya sido testigo del acelerado proceso de Nearshoring, donde muchas empresas internacionales han decidido invertir en nuestro país para abrir megafábricas. Recientemente destaca el caso de Testa y su gigafábrica en el estado de Nuevo León. . Este fenómeno podría traer grandes beneficios a nuestro país por todas las pérdidas económicas que conlleva. Según el Global Business Council (CEG) (2023), el nearshoring podría generar hasta 4 millones de empleos en territorio mexicano para 2030, recibiendo entre 30 y 50 mil millones de dólares anuales, además, el mismo estudio señala que este fenómeno puede ser responsable de aumentando el PIB de México hasta en un 2.5% en los próximos 6 años. Por lo tanto, es muy importante analizar y comprender este fenómeno a través del análisis estadístico de datos históricos de Inversión Extranjera Directa y algunas variables macroeconómicas que están estrechamente relacionadas con dicha variable dependiente.
setwd("../databases/nearshoring")
df=read.csv("quarter_economic_data.csv")
summary(df)
## Year Quarter New_FDI_Inflows Exchange_Rate
## Min. :2006 Min. :1.000 Min. :-2433 Min. :10.82
## 1st Qu.:2010 1st Qu.:1.000 1st Qu.: 1934 1st Qu.:12.65
## Median :2014 Median :2.000 Median : 2605 Median :13.65
## Mean :2014 Mean :2.478 Mean : 3001 Mean :15.59
## 3rd Qu.:2018 3rd Qu.:3.000 3rd Qu.: 3750 3rd Qu.:19.26
## Max. :2023 Max. :4.000 Max. :15445 Max. :21.60
##
## new_fdi_inflows_mxn log_new_fdi_inflows_mxn new_foreign_businesses
## Min. :-37081 Min. :-10.52 Min. : 1.000
## 1st Qu.: 33164 1st Qu.: 10.41 1st Qu.: 5.000
## Median : 46617 Median : 10.75 Median : 8.000
## Mean : 51775 Mean : 10.10 Mean : 8.145
## 3rd Qu.: 65069 3rd Qu.: 11.08 3rd Qu.:11.000
## Max. :237466 Max. : 12.38 Max. :21.000
##
## Población_Economicamente_Activa Poblacion_ocupada_industria_manufacturera
## Min. :2601760 Min. :13942848
## 1st Qu.:3404623 1st Qu.:15463066
## Median :3433560 Median :16917276
## Mean :3440431 Mean :16696687
## 3rd Qu.:3525446 3rd Qu.:17975390
## Max. :3597380 Max. :19516476
## NA's :20 NA's :20
## Poblacion_ocupada Tasa_de_ocupacion_industria_manufacturera
## Min. : 89430135 Min. : 928.3
## 1st Qu.: 96999416 1st Qu.:1002.1
## Median :102344068 Median :1040.2
## Mean :102769315 Mean :1028.8
## 3rd Qu.:107429516 3rd Qu.:1062.1
## Max. :116984252 Max. :1082.7
## NA's :20 NA's :20
str(df)
## 'data.frame': 69 obs. of 11 variables:
## $ Year : int 2006 2006 2006 2006 2007 2007 2007 2007 2008 2008 ...
## $ Quarter : int 1 2 3 4 1 2 3 4 1 2 ...
## $ New_FDI_Inflows : num 897 2110 1284 2678 3108 ...
## $ Exchange_Rate : num 10.8 10.9 10.9 10.9 10.9 ...
## $ new_fdi_inflows_mxn : num 15471 36790 22338 46617 52252 ...
## $ log_new_fdi_inflows_mxn : num 9.65 10.51 10.01 10.75 10.86 ...
## $ new_foreign_businesses : int 10 8 10 13 4 21 7 5 7 6 ...
## $ Población_Economicamente_Activa : int NA NA NA NA NA NA NA NA NA NA ...
## $ Poblacion_ocupada_industria_manufacturera: num NA NA NA NA NA NA NA NA NA NA ...
## $ Poblacion_ocupada : num NA NA NA NA NA NA NA NA NA NA ...
## $ Tasa_de_ocupacion_industria_manufacturera: num NA NA NA NA NA NA NA NA NA NA ...
# Calculamos el número de NA por columna
nas_por_columna <- sapply(df, function(x) sum(is.na(x)))
# Filtramos las columnas que tienen 7 o más NA para eliminarlas
columnas_para_eliminar <- names(nas_por_columna[nas_por_columna >= 7])
df <- df %>% select(-one_of(columnas_para_eliminar))
# Para las columnas restantes, imputamos los NA con la mediana
df <- df %>% mutate(across(.cols = where(~ sum(is.na(.)) < 7),
.fns = ~ ifelse(is.na(.), median(., na.rm = TRUE), .)))
Se realizó una imputación de las variables y se eliminaron aquellas con demasiados valores NAS faltantes.
Analisis de la Base de Nearshoring
summary(df)
## Year Quarter New_FDI_Inflows Exchange_Rate
## Min. :2006 Min. :1.000 Min. :-2433 Min. :10.82
## 1st Qu.:2010 1st Qu.:1.000 1st Qu.: 1934 1st Qu.:12.65
## Median :2014 Median :2.000 Median : 2605 Median :13.65
## Mean :2014 Mean :2.478 Mean : 3001 Mean :15.59
## 3rd Qu.:2018 3rd Qu.:3.000 3rd Qu.: 3750 3rd Qu.:19.26
## Max. :2023 Max. :4.000 Max. :15445 Max. :21.60
## new_fdi_inflows_mxn log_new_fdi_inflows_mxn new_foreign_businesses
## Min. :-37081 Min. :-10.52 Min. : 1.000
## 1st Qu.: 33164 1st Qu.: 10.41 1st Qu.: 5.000
## Median : 46617 Median : 10.75 Median : 8.000
## Mean : 51775 Mean : 10.10 Mean : 8.145
## 3rd Qu.: 65069 3rd Qu.: 11.08 3rd Qu.:11.000
## Max. :237466 Max. : 12.38 Max. :21.000
dataf=df
data2 <- df %>% select(Year, Quarter, New_FDI_Inflows)
data2$Fecha <- as.Date(paste(data2$Year, data2$Quarter), format = "%Y %B")
time_serie <- ts(data2$New_FDI_Inflows, start = c(2006, 1), frequency = 4)
print(time_serie)
## Qtr1 Qtr2 Qtr3 Qtr4
## 2006 896.56 2110.38 1284.01 2677.70
## 2007 3108.22 2560.70 6059.17 6298.70
## 2008 2502.17 1915.81 4039.98 4595.51
## 2009 2984.47 2254.08 1056.01 4713.82
## 2010 2947.54 6678.89 2259.95 3749.87
## 2011 3058.29 2091.13 2604.85 1944.86
## 2012 1493.80 2111.70 2401.90 -1691.33
## 2013 749.06 15444.59 262.28 5582.68
## 2014 2427.14 -2433.24 441.89 5326.99
## 2015 4406.85 2816.75 4501.10 1724.29
## 2016 3850.77 1460.80 1550.18 4129.80
## 2017 2780.67 3134.15 3570.25 2454.70
## 2018 1934.09 2292.64 4226.74 2869.82
## 2019 2584.06 2406.22 4959.36 3579.50
## 2020 2603.81 799.40 1606.59 1731.87
## 2021 2250.76 3657.32 4149.31 3607.11
## 2022 8823.96 3664.91 2653.16 2817.87
## 2023 931.69
Se convirtió la variable de Año en el formato adecuado de fecha.
plot(time_serie, main = "IED quarter", xlab = "Year quarter", ylab = "IED")
Podemos ver que el gráfico presenta un claro componente de
estacionalidad y puede haber cierta estacionariedad, sin embargo, se ve
una tendencia ascendente a lo largo de toda la serie de tiempo, por lo
que es necesario aplicar diversas pruebas para comprender mejor nuestra
serie de tiempo.
descompose<-decompose(time_serie)
plot(descompose)
En el gráfico anterior podemos observar una ligera tendencia en toda la serie temporal como se describió anteriormente, esto podría afectar la presencia de estacionariedad. Por otro lado, se evidencia el componente estacional, que aumenta en algunos trimestres de cada período. Esto se puede explicar en el contexto de la variable dependiente con estacionalidades en la demanda de bienes y servicios, eventos económicos como ferias comerciales o temporadas de impuestos. , o incluso patrones estacionales en la disponibilidad de recursos naturales.
Todo esto hace que en algunas partes de cada año la IED aumente y disminuya periódicamente. Respecto al componente aleatorio residual, se observa cierto ruido en las series temporales, especialmente en el período 2013-2015 y 2020 a 2022. Esto se debe a variaciones en la serie temporal que no pueden explicarse con componentes de estacionalidad o tendencias en la serie temporal. Esto, en un contexto real, se puede explicar con fenómenos con las reformas constitucionales del presidente Enrique Peña Nieto en 2013 y la pandemia de COVID-19 a partir de 2020.
# The stationarity of the series is checked with the following ADF test.
adf.test(time_serie)
##
## Augmented Dickey-Fuller Test
##
## data: time_serie
## Dickey-Fuller = -5.631, Lag order = 4, p-value = 0.01
## alternative hypothesis: stationary
El resultado de la Prueba Aumentada de Dickey-Fuller (ADF) con un valor p de 0.01 (menor a 0.05) indica que la serie temporal “time_series” es estacionaria, lo que significa que no muestra tendencias en el tiempo.
acf(time_serie,main="Significant Autocorrelations")
Podemos observar que la serie no muestra de autocorrelación serial, ya que en los periodos la función de autocorrelación no excede las líneas de significancia.
summary(arma<-arma(diff(time_serie)),order=c(1,1))
##
## Call:
## arma(x = diff(time_serie))
##
## Model:
## ARMA(1,1)
##
## Residuals:
## Min 1Q Median 3Q Max
## -4043.9 -454.3 152.0 1327.9 12087.5
##
## Coefficient(s):
## Estimate Std. Error t value Pr(>|t|)
## ar1 0.1571 NA NA NA
## ma1 -1.1888 NA NA NA
## intercept 109.8050 NA NA NA
##
## Fit:
## sigma^2 estimated as 4774485, Conditional Sum-of-Squares = 330433746, AIC = 1244.73
plot(arma)
Estos coeficientes indican una correlación positiva débil con el valor
anterior y una correlación negativa fuerte con el error en el período
anterior, respectivamente. Además, se ha incluido un término de
interceptación con un valor estimado de 109.8050
Los residuos del modelo tienen una varianza estimada (sigma^2) de 4774485 y los resultados del ajuste muestran un AIC muy alto.
summary(arima<-Arima(diff(log((time_serie))),order=c(1,1,1)))
## Series: diff(log((time_serie)))
## ARIMA(1,1,1)
##
## Coefficients:
## ar1 ma1
## -0.6977 -1.0000
## s.e. 0.0904 0.0481
##
## sigma^2 = 0.5655: log likelihood = -73.89
## AIC=153.78 AICc=154.17 BIC=160.4
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set -0.05654218 0.7341827 0.5578686 71.55558 166.8534 0.7016035
## ACF1
## Training set -0.02718879
plot(arima)
El coeficiente autorregresivo (AR1) es -0,6977 y el coeficiente de media móvil (MA1) es -1,0000. Estos coeficientes indican que el valor actual de la serie temporal logarítmicamente diferenciada está correlacionado negativamente con su valor anterior y con el error en el período anterior.
La varianza estimada del modelo (sigma^2) es 0,0.5655. El valor logarítmico de verosimilitud es -73.89, y los criterios de información, como el AIC (Akaike Information Criterion), el AIC corregido (AICc) y el BIC (Bayesian Information Criterion), indican que este modelo podría ser apropiado para la serie temporal.
Modelo Arma
arma_residuals<-arma$residuals
Box.test(arma_residuals,lag=1,type="Ljung-Box")
##
## Box-Ljung test
##
## data: arma_residuals
## X-squared = 3.2686, df = 1, p-value = 0.07062
El valor de p obtenido en la prueba de Box-Ljung (0,07) es mayor que el valor de p máximo comúnmente utilizado que es 0,05. Esto significa que no se encontró evidencia significativa de autocorrelación en los residuos, ya que el valor p es mayor que 0,05, lo que respalda la validez del modelo en términos de autocorrelación.
#Testing residuals
suppressWarnings({
arma$residuals <- na.omit(arma$residuals)
adf.test(arma$residuals)
})
##
## Augmented Dickey-Fuller Test
##
## data: arma$residuals
## Dickey-Fuller = -6.32, Lag order = 4, p-value = 0.01
## alternative hypothesis: stationary
El valor de p de 0,01, inferior al umbral de 0,05, indica una fuerte evidencia contra la hipótesis nula de no estacionariedad. Esto significa que es poco probable que los residuos sean no estacionarios.
hist(arma$residuals)
Se aprecia relativa normalidad en los residuales.
Modelo Arima
arima_residuals<-arima$residuals
Box.test(arima_residuals,lag=1,type="Ljung-Box")
##
## Box-Ljung test
##
## data: arima_residuals
## X-squared = 0.049564, df = 1, p-value = 0.8238
El valor de p obtenido en la prueba de Box-Ljung (0,8) es mayor que el valor de p máximo comúnmente utilizado que es 0,05. Esto significa que no se encontró evidencia significativa de autocorrelación en los residuos, ya que el valor p es mayor que 0,05, lo que respalda la validez del modelo en términos de autocorrelación.
residuals_ts <- arima$residuals
# Interpolar los valores NA
residuals_clean <- na.approx(residuals_ts)
suppressWarnings({
adf_test_result <- adf.test(residuals_clean)
})
# Ver el resultado
print(adf_test_result)
##
## Augmented Dickey-Fuller Test
##
## data: residuals_clean
## Dickey-Fuller = -2.9227, Lag order = 4, p-value = 0.2004
## alternative hypothesis: stationary
El valor de p de 0,01, inferior al umbral de 0,05, indica una fuerte evidencia contra la hipótesis nula de no estacionariedad. Esto significa que es poco probable que los residuos sean no estacionarios.
hist(arima$residuals)
Se aprecia normalidad en los residuales del modelo 2.
Debido a métricas como el AIC y a las pruebas de diagnóstico, el modelo 2 es elegido como el más apropiado.
suppressWarnings({
arima_restauracion<-exp(arima$fitted) # The variables are transformed back to the originals (if log is applied, the exponential must be applied (it is the opposite))
vector2 =c(arima_restauracion) #reverting "log" operation using "exp"
original2 <-c(time_serie) #Converting into a vector.
restauracion2 = vector2+original2 #reverting "diff" operation summing the original values to the differences.
ts2 <- ts(restauracion2, start = 1, end = length(restauracion2), frequency = 4) #Make time series
})
# Forecast (ARIMA)
arima_forecast<-forecast(ts2,h=5)
arima_forecast
## Point Forecast Lo 80 Hi 80 Lo 95 Hi 95
## 24 Q4 3036.064 1121.9856 4950.143 108.73368 5963.394
## 25 Q1 3742.547 1383.0682 6102.026 134.03557 7351.058
## 25 Q2 2318.412 856.7754 3780.049 83.03154 4553.793
## 25 Q3 3128.604 1156.1840 5101.025 112.04764 6145.161
## 25 Q4 3036.064 1121.9853 4950.143 108.73322 5963.395
plot(arima_forecast)
autoplot(arima_forecast)
En el pronóstico realizado para la Inversión Extranjera Directa (IED) relacionada con el fenómeno del nearshoring, se observan tendencias y variaciones interesantes para los próximos cinco trimestres. La predicción se presenta con intervalos de confianza del 80% y del 95%, lo que nos permite entender la incertidumbre asociada con cada estimación de punto.
Para el cuarto trimestre del año 24, el pronóstico de punto estima una IED de 3,036.064 millones de dólares. Los intervalos de confianza sugieren que, con un 80% de confianza, la IED podría variar entre 1,121.986 y 4,950.143 millones de dólares. Ampliando la certeza al 95%, el rango se extiende desde 108.734 hasta 5,963.394 millones de dólares, indicando una mayor incertidumbre en las estimaciones.
En el primer trimestre del año 25, se espera un aumento en la IED hasta los 3,742.547 millones de dólares. El intervalo de confianza del 80% se sitúa entre 1,383.068 y 6,102.026 millones de dólares, mientras que el intervalo al 95% se amplía desde 134.036 hasta 7,351.058 millones de dólares, reflejando nuevamente la incertidumbre en el pronóstico.
Para el segundo trimestre del año 25, el pronóstico muestra una disminución en la IED a 2,318.412 millones de dólares. Los intervalos de confianza para este trimestre son más estrechos, con el intervalo del 80% variando entre 856.775 y 3,780.049 millones de dólares, y el del 95% entre 83.032 y 4,553.793 millones de dólares.
En el tercer trimestre del año 25, se prevé un repunte en la IED a 3,128.604 millones de dólares, con intervalos de confianza similares a los observados en el cuarto trimestre del año 24.
Finalmente, para el cuarto trimestre del año 25, el pronóstico vuelve a estimar una IED de 3,036.064 millones de dólares, con intervalos de confianza prácticamente idénticos a los del cuarto trimestre del año 24.
Este análisis de pronóstico muestra una variabilidad significativa en la IED esperada relacionada con el nearshoring a lo largo de los próximos cinco trimestres.
#file.choose()
setwd("../databases/")
ventas1 <- read_excel("form/FORM-Ventas.xlsx")
ventas2 <- read_excel("form/FORM-Ventas.xlsx")
# data de bases
names(ventas1)
## [1] "Mes" "Año" "Total Carton" "Total Retornable"
## [5] "Servicios" "Muestras" "Variación" "Ventas Totales"
str(ventas1)
## tibble [72 × 8] (S3: tbl_df/tbl/data.frame)
## $ Mes : chr [1:72] "Enero" "Febrero" "Marzo" "Abril" ...
## $ Año : num [1:72] 2017 2017 2017 2017 2017 ...
## $ Total Carton : num [1:72] NA NA NA NA NA NA NA NA NA NA ...
## $ Total Retornable: num [1:72] NA NA NA NA NA NA NA NA NA NA ...
## $ Servicios : num [1:72] NA NA NA NA NA NA NA NA NA NA ...
## $ Muestras : num [1:72] NA NA NA NA NA NA NA NA NA NA ...
## $ Variación : num [1:72] NA NA NA NA NA NA NA NA NA NA ...
## $ Ventas Totales : num [1:72] 5166155 5166155 5166155 5166155 5166155 ...
Analisis de Numero de Data Faltante
# Calcula y muestra la cantidad de valores NA por columna en ventas1.
na_count1 <- colSums(is.na(ventas1))
na_count1
## Mes Año Total Carton Total Retornable
## 0 0 51 51
## Servicios Muestras Variación Ventas Totales
## 51 63 63 0
# Elimina columnas con NA en ventas1 y las últimas 3 filas.
ventas1 <- ventas1[, colSums(is.na(ventas1)) == 0]
ventas1 <- head(ventas1, -3)
# Calcula y muestra la cantidad de valores NA por columna en ventas2.
na_count2 <- colSums(is.na(ventas2))
na_count2
## Mes Año Total Carton Total Retornable
## 0 0 51 51
## Servicios Muestras Variación Ventas Totales
## 51 63 63 0
# Elimina filas con NA en ventas2.
ventas2 <- ventas2[complete.cases(ventas2), ]
# Renombra la columna "Ventas Totales" a "Ventas_totales" en ventas1.
names(ventas1)[names(ventas1) == "Ventas Totales"] <- "Ventas_totales"
Observamos una presencia significativa de valores NA. Por ello, decidimos eliminar las columnas que contengan valores NA en la base de datos 1 y las filas con valores NA en la base de datos 2.
#ventas1$Mes <- as.yearmon(paste(ventas1$Año, ventas1$Mes), "%Y %B")
#ventas2$Mes <- as.yearmon(paste(ventas2$Año, ventas2$Mes), "%Y %B")
ventas1$Mes <- as.Date(paste(ventas1$Año, ventas1$Mes), format = "%Y %B")
Ventas <- ts(ventas1$Ventas_totales, start = c(2017, 1), end=c(2022,9), frequency = 12)
print(Ventas)
## Jan Feb Mar Apr May Jun Jul Aug
## 2017 5166155 5166155 5166155 5166155 5166155 5166155 5166155 5166155
## 2018 7248220 7248220 7248220 7248220 7248220 7248220 7248220 7248220
## 2019 6786917 6786917 6786917 6786917 6786917 6786917 6786917 6786917
## 2020 6059791 6643181 8368674 4925778 2235669 7842003 5599913 8883507
## 2021 9294478 11179236 10360017 7872345 9219847 5407600 7936029 4773524
## 2022 7534073 7898590 10597117 8397928 7786912 8623444 9495207 11053017
## Sep Oct Nov Dec
## 2017 5166155 5166155 5166155 5166155
## 2018 7248220 7248220 7248220 7248220
## 2019 6786917 6786917 6786917 6786917
## 2020 7452457 8078683 7539929 12285123
## 2021 6358278 5123874 5913523 6500150
## 2022 11577528
La variable dependiente se define como “Ventas Totales”, correspondiente a las ventas totales realizadas por FORM.
ts_plot(Ventas)
Entre 2018 y 2020, la serie de tiempo muestra una tendencia lineal. Sin embargo, después de 2020, emerge un patrón estacional claro, y aunque puede presentar cierta estacionariedad, se observa una tendencia ascendente general a lo largo de todo el periodo analizado.
Ventasdesc<-decompose(Ventas)
plot(Ventasdesc)
La tendencia, que representa el componente a largo plazo de la serie de tiempo, indica un aumento constante en las ventas totales de FORM a lo largo del periodo observado.
La estacionalidad, por otro lado, refleja las variaciones a corto plazo, revelando que las ventas de FORM tienden a incrementarse en determinadas épocas del año, como el último trimestre, y disminuir en otras, como el primer trimestre, lo cual podría estar relacionado con el aumento progresivo en la demanda de los clientes a medida que avanza el año, seguido de una caída hacia el final.
La aleatoriedad, el componente impredecible de la serie de tiempo, indica fluctuaciones en los datos que no se explican por la tendencia ni por la estacionalidad, sugiriendo incrementos inesperados en la demanda por parte de los clientes.
adf.test(ventas1$Ventas_totales)
##
## Augmented Dickey-Fuller Test
##
## data: ventas1$Ventas_totales
## Dickey-Fuller = -2.7165, Lag order = 4, p-value = 0.284
## alternative hypothesis: stationary
Dado que el valor p de 0.284 supera el umbral de significancia comúnmente aceptado de 0.05, no contamos con suficiente evidencia para descartar la hipótesis nula, que asume la no estacionariedad de la serie de tiempo. Por ende, de acuerdo con este análisis, la serie temporal se considera no estacionaria.
acf(ventas1$Ventas_totales)
El gráfico indica que la Función de Autocorrelación (ACF) es positiva para los rezagos 1, 2 y 3, lo que sugiere una correlación positiva entre los valores de la serie temporal en estos intervalos. Esto implica que los valores de la serie tienden a moverse en la misma dirección en estos periodos.
Por otro lado, la ACF es negativa para los rezagos 4, 5 y 6, señalando una correlación negativa en estos puntos. Esto significa que los valores de la serie temporal tienden a moverse en direcciones opuestas durante estos intervalos.
Estas características sugieren que la serie temporal podría exhibir un comportamiento estacional, donde la correlación positiva a corto plazo indica patrones de movimiento conjunto debido a tendencias estacionales, como períodos de alta o baja demanda durante ciertas épocas del año. La correlación negativa a más largo plazo podría indicar una tendencia de los valores de la serie a retornar hacia un promedio a lo largo del tiempo, reflejando una reversión a la media estacional.
summary(ARMA<-arma(diff(Ventas)),order=c(1,1))
##
## Call:
## arma(x = diff(Ventas))
##
## Model:
## ARMA(1,1)
##
## Residuals:
## Min 1Q Median 3Q Max
## -4683342 -153905 -146579 202842 4318165
##
## Coefficient(s):
## Estimate Std. Error t value Pr(>|t|)
## ar1 -4.971e-01 2.035e-01 -2.443 0.0146 *
## ma1 -5.459e-02 2.396e-01 -0.228 0.8198
## intercept 1.386e+05 NaN NaN NaN
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Fit:
## sigma^2 estimated as 1.882e+12, Conditional Sum-of-Squares = 1.242001e+14, AIC = 2120.88
plot(ARMA)
El término AR(1) es significativo (p-value = 0.0146), lo que indica que es importante en el modelo. Sin embargo, el término MA(1) no es significativo (p-value = 0.8199). Los residuos del modelo tienen una varianza estimada (sigma^2) de 1.882e+12 y los resultados del ajuste muestran un AIC de 2120.88. Además, se ha incluido un término de interceptación con un valor estimado de 1.386e+05
summary(ARIMA<-Arima(diff(log((Ventas))),order=c(1,1,1)))
## Series: diff(log((Ventas)))
## ARIMA(1,1,1)
##
## Coefficients:
## ar1 ma1
## -0.4977 -1.0000
## s.e. 0.1040 0.0422
##
## sigma^2 = 0.05168: log likelihood = 2.55
## AIC=0.91 AICc=1.29 BIC=7.52
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE ACF1
## Training set 0.004611339 0.2222576 0.1163891 NaN Inf 0.4462246 -0.06226768
plot(ARIMA)
Los coeficientes estimados para el término AR(1) y el término MA(1) son -0.4977 y -1.0000 respectivamente. Esto indica que hay una relación negativa entre el valor actual y los valores rezagados.
Los errores estándar de los coeficientes (s.e.) son 0.1040 y 0.0422 para el término AR(1) y el término MA(1) respectivamente.
La varianza estimada de los errores del modelo (sigma^2) es de aproximadamente 0.05168.
El logaritmo de la verosimilitud es de aproximadamente 2.55 y el AIC es de 0.91. Estas medidas proporcionan información sobre la calidad del ajuste del modelo, con valores más bajos indicando un mejor ajuste.
La serie de tiempo de las ventas no es estacionaria, lo que significa que la media y la varianza de la serie de tiempo están cambiando con el tiempo.
ARMA
arma_residuals<-ARMA$residuals
Box.test(arma_residuals,lag=1,type="Ljung-Box")
##
## Box-Ljung test
##
## data: arma_residuals
## X-squared = 3.1682e-05, df = 1, p-value = 0.9955
Esto significa que no se encontró evidencia significativa de autocorrelación en los residuos.
suppressWarnings({
ARMA$residuals <- na.omit(ARMA$residuals)
adf.test(ARMA$residuals)
})
##
## Augmented Dickey-Fuller Test
##
## data: ARMA$residuals
## Dickey-Fuller = -3.231, Lag order = 4, p-value = 0.09034
## alternative hypothesis: stationary
Dado que el valor p (0.09034) es mayor que el nivel de significancia comúnmente utilizado de 0.05, no podemos afirmar con confianza que los residuos sean estacionarios según esta prueba.
hist(ARIMA$residuals)
La normalidad se ve en los residuales.
ARIMA
arima_residuals<-ARIMA$residuals
Box.test(arima_residuals,lag=1,type="Ljung-Box")
##
## Box-Ljung test
##
## data: arima_residuals
## X-squared = 0.27546, df = 1, p-value = 0.5997
Esto significa que no se encontró evidencia significativa de autocorrelación en los residuos.
suppressWarnings({
ARIMA$residuals <- na.omit(ARIMA$residuals)
adf.test(ARIMA$residuals)
})
##
## Augmented Dickey-Fuller Test
##
## data: ARIMA$residuals
## Dickey-Fuller = -3.6993, Lag order = 4, p-value = 0.03156
## alternative hypothesis: stationary
Dado que el valor p (0.03156) es menor que el nivel de significancia comúnmente utilizado de 0.05, los residuos parecen ser estacionarios según esta prueba.
hist(ARIMA$residuals)
La normalidad se ve en los residuales.
Se selecciono el modelo ARIMA, ya que tiene el AIC mas bajo en comparación con el modelo ARMA.
suppressWarnings({
# Asigna las predicciones ajustadas por el modelo ARIMA a la variable.
arima_restauracion <- (ARIMA$fitted)
# Convierte las predicciones ajustadas en un vector.
vector2 <- c(arima_restauracion)
# Convierte los datos originales de ventas en un vector.
original2 <- c(Ventas)
# Realiza la operación inversa a la diferencia, sumando los valores originales a las diferencias.
restauracion2 <- vector2 + original2
# Convierte el vector restaurado en una serie temporal, especificando inicio, fin y frecuencia.
ts2 <- ts(restauracion2, start = 1, end = length(restauracion2), frequency = 12)
})
arima_forecast<-forecast(ts2,h=5)
arima_forecast
## Point Forecast Lo 80 Hi 80 Lo 95 Hi 95
## Feb 69 5842742 4269322 7416162 3436403 8249081
## Mar 69 6439323 4550657 8327989 3550858 9327788
## Apr 69 5807800 3886135 7729466 2868867 8746734
## May 69 5986388 3885645 8087132 2773578 9199199
## Jun 69 6553629 4200423 8906835 2954712 10152546
plot(arima_forecast)
autoplot(arima_forecast)
Forecast Calculado
Los pronósticos para los próximos periodos se presentan a continuación, reflejando las expectativas de ventas futuras basadas en el análisis realizado:
Cada valor representa la proyección de ventas para el periodo correspondiente, indicando fluctuaciones en la demanda o en las tendencias de ventas identificadas por el modelo. Estos pronósticos son cruciales para la planificación estratégica y la toma de decisiones en el ámbito empresarial.
Del conjunto de datos, se seleccionaron las variables explicativas que podrían explicar las ventas de FORM.
setwd("../databases/")
ventas2 <- read_excel("form/FORM-Ventas.xlsx")
names(ventas2)[names(ventas2) == "Ventas Totales"] <- "Ventas_totales"
names(ventas2)[names(ventas2) == "Total Carton"] <- "Total_carton"
names(ventas2)[names(ventas2) == "Total Retornable"] <- "Total_retornable"
names(ventas2)[names(ventas2) == "Variación"] <- "Variacion"
Sys.setlocale("LC_TIME", "es_ES.UTF-8")
## [1] "es_ES.UTF-8"
ventas2 <- na.omit(ventas2[, c("Año", "Mes", "Ventas_totales", "Total_carton", "Total_retornable", "Variacion", "Servicios", "Muestras")])
ventas2$Fecha <- as.Date(paste(ventas2$Año, ventas2$Mes, "01"), format = "%Y %B %d")
Ventas2 <- ts(ventas2$Ventas_totales, start = c(as.numeric(format(min(ventas2$Fecha), "%Y")), as.numeric(format(min(ventas2$Fecha), "%m"))), frequency = 12)
plot(Ventas2)
Carton <- ts(ventas2$Total_carton, start = c(year(min(ventas2$Fecha)), month(min(ventas2$Fecha))), frequency = 12)
ts_plot(Carton)
Retornable <- ts(ventas2$Total_retornable, start = c(year(min(ventas2$Fecha)), month(min(ventas2$Fecha))), frequency = 12)
ts_plot(Retornable)
servicio <- ts(ventas2$Servicios, start = c(year(min(ventas2$Fecha)), month(min(ventas2$Fecha))), frequency = 12)
ts_plot(servicio)
muestra <- ts(ventas2$Muestras, start = c(year(min(ventas2$Fecha)), month(min(ventas2$Fecha))), frequency = 12)
ts_plot(muestra)
variacion <- ts(ventas2$Variacion, start = c(year(min(ventas2$Fecha)), month(min(ventas2$Fecha))), frequency = 12)
ts_plot(variacion)
Total cartón: al igual que la variable dependiente, muestra una tendencia de crecimiento, esto puede significar que estan altamente relacionadas.
Total retornable: al igual que la variable dependiente, muestra una tendencia de crecimiento, esto puede significar que estan altamente relacionadas.
Serivicos: La serie temporal no muestra una relación clara entre los servicios y las ventas, esto puede ser debido a la demanda del mercado.
adf.test(Carton)
##
## Augmented Dickey-Fuller Test
##
## data: Carton
## Dickey-Fuller = -0.6872, Lag order = 2, p-value = 0.9594
## alternative hypothesis: stationary
Dado que el valor p (0.9594) es mucho mayor que el nivel de significancia comúnmente utilizado de 0.05, o podemos afirmar con confianza que la serie “Carton” sea estacionaria según esta prueba.
adf.test(Retornable)
##
## Augmented Dickey-Fuller Test
##
## data: Retornable
## Dickey-Fuller = -1.3311, Lag order = 2, p-value = 0.8272
## alternative hypothesis: stationary
Dado que el valor p (0.8272) es mucho mayor que el nivel de significancia comúnmente utilizado de 0.05, o podemos afirmar con confianza que la serie “Carton” sea estacionaria según esta prueba.
var_ts<-cbind(diff(log(Ventas2)), diff(log(Carton)), diff(log(Retornable)))
colnames(var_ts)<-cbind("Ventas_2", "Carton", "Retornable")
acf_var_ts <- lapply(var_ts, acf)
head(var_ts)
## Ventas_2 Carton Retornable
## Feb 2022 0.04724851 0.1841863 -0.6135258
## Mar 2022 0.29389769 0.1113557 1.1143465
## Apr 2022 -0.23259698 -0.0999837 -1.0579750
## May 2022 -0.07554059 -0.1447440 0.3906362
## Jun 2022 0.10204007 0.2323875 -0.4549069
## Jul 2022 0.09630262 -0.1789962 1.0948009
var_ts <- ts(var_ts, frequency = 1, start = c(2022))
# Realiza la selección de rezagos
lag_selection <- VARselect(var_ts,lag.max=3,type="const", season=12)
# Imprime los resultados
lag_selection$selection
## AIC(n) HQ(n) SC(n) FPE(n)
## 1 1 1 1
lag_selection$criteria
## 1 2 3
## AIC(n) -Inf -Inf -Inf
## HQ(n) -Inf -Inf -Inf
## SC(n) -Inf -Inf -Inf
## FPE(n) 0 0 0
var_ts
## Time Series:
## Start = 2022
## End = 2029
## Frequency = 1
## Ventas_2 Carton Retornable
## 2022 0.04724851 0.1841863 -0.6135258
## 2023 0.29389769 0.1113557 1.1143465
## 2024 -0.23259698 -0.0999837 -1.0579750
## 2025 -0.07554059 -0.1447440 0.3906362
## 2026 0.10204007 0.2323875 -0.4549069
## 2027 0.09630262 -0.1789962 1.0948009
## 2028 0.15191627 0.3432633 -1.3816387
## 2029 0.04636259 -0.1319051 1.5359121
var_modelo<-VAR(var_ts,p=1)
#summary(VAR_ev2model1)
matriz_correlacion <- cor(var_ts)
# Imprimir la matriz de correlación
print(matriz_correlacion)
## Ventas_2 Carton Retornable
## Ventas_2 1.0000000 0.5037499 0.3336449
## Carton 0.5037499 1.0000000 -0.6041826
## Retornable 0.3336449 -0.6041826 1.0000000
No es posible aplicar el modelo VAR debido a la alta correlación entre las variables explicativas y la variable dependiente. Este fenómeno podría explicarse por el hecho de que el total de cartón y el total de retornable constituyen conjuntamente el total de ventas. La matriz de correlación revela lo siguiente:
Ventas_2 y Carton es
aproximadamente 0.5037. Esto sugiere una correlación
positiva moderada entre estas dos variables.Ventas_2 y Retornable
es aproximadamente 0.3336. Esto también indica una
correlación positiva, pero más débil en comparación con la correlación
entre Ventas_2 y Carton.modelo <- lm(Ventas_totales ~ Total_carton + Total_retornable + servicio + muestra + variacion, data = ventas2)
durbinWatsonTest(modelo)
## lag Autocorrelation D-W Statistic p-value
## 1 0.2217584 1.061769 0
## Alternative hypothesis: rho != 0
Según el test de Durbin-Watson, no hay evidencia de autocorrelación de primer orden en los residuos del modelo de regresión lineal.
var_residuals<-data.frame(residuals(var_modelo))
forecast_2<-predict(var_modelo,n.ahead=5,ci=0.95) ### forecast for the next 12 months
fanchart(forecast_2,names="Ventas",main="Ventas",xlab="Time Period",ylab="Ventas")
forecast_2
## $Ventas_2
## fcst lower upper CI
## [1,] 0.06664341 -0.3821737 0.5154605 0.4488171
## [2,] 0.03512111 -0.4255364 0.4957786 0.4606575
## [3,] 0.07128064 -0.3925222 0.5350835 0.4638028
## [4,] 0.03611558 -0.4289356 0.5011667 0.4650511
## [5,] 0.06683582 -0.3984906 0.5321622 0.4653264
##
## $Carton
## fcst lower upper CI
## [1,] 0.16278859 -0.2454587 0.5710359 0.4082473
## [2,] -0.04597671 -0.4960796 0.4041261 0.4501029
## [3,] 0.09099331 -0.3889659 0.5709526 0.4799592
## [4,] 0.01054197 -0.4945303 0.5156143 0.5050723
## [5,] 0.04942303 -0.4742693 0.5731153 0.5236923
##
## $Retornable
## fcst lower upper CI
## [1,] -1.11951654 -1.6385358 -0.6004972 0.5190193
## [2,] 0.81272223 -0.2119736 1.8374181 1.0246959
## [3,] -0.48314477 -2.1151728 1.1488833 1.6320281
## [4,] 0.29935152 -1.8127393 2.4114423 2.1120908
## [5,] -0.09891405 -2.5412956 2.3434675 2.4423815
forecast_2$fcst$Ventas_2 <- exp(forecast_2$fcst$Ventas_2)
forecast_2$fcst$Ventas_2[1] = forecast_2$fcst$Ventas_2[1] + tail(ventas2$Ventas_totales, 1)
forecast_2$fcst$Ventas_2[2] = forecast_2$fcst$Ventas_2[2] + tail(ventas2$Ventas_totales, 1)
forecast_2$fcst$Ventas_2[3] = forecast_2$fcst$Ventas_2[3] + tail(ventas2$Ventas_totales, 2)
forecast_2$fcst$Ventas_2[4] = forecast_2$fcst$Ventas_2[4] + tail(ventas2$Ventas_totales, 3)
forecast_2$fcst$Ventas_2[5] = forecast_2$fcst$Ventas_2[5] + tail(ventas2$Ventas_totales, 4)
forecast_2$fcst$Ventas_2
## fcst lower upper CI
## [1,] 11577529 0.6823765 1.674409 1.566458
## [2,] 11577529 0.6534192 1.641776 1.585116
## [3,] 11053018 0.6753514 1.707591 1.590109
## [4,] 9495208 0.6512019 1.650646 1.592096
## [5,] 8623445 0.6713326 1.702610 1.592534
Presentamos a continuación las proyecciones de ventas utilizando el modelo VAR para los próximos cinco periodos. Estas estimaciones nos permiten anticipar la dinámica del mercado y ajustar nuestras estrategias operativas y financieras acorde a las expectativas futuras:
Estas proyecciones son una herramienta vital para la planificación estratégica, permitiéndonos preparar con anticipación para los cambios en el entorno de ventas.
Los pronósticos para las ventas en los próximos cinco períodos revelan tendencias y desafíos importantes para el futuro próximo. Al inicio, se espera que las ventas se mantengan estables, alcanzando una cifra proyectada de alrededor de 11,577,529 en el primer período. Esta estabilidad sugiere una fase de mercado sin grandes cambios, ofreciendo una oportunidad para consolidar estrategias actuales.
Para el segundo período, las proyecciones indican una continuidad en esta tendencia, con ventas esperadas similares a las del primer período. Esta persistencia subraya una etapa de estabilidad, posiblemente debido a la efectividad de las estrategias de mercado actuales o a un equilibrio en la dinámica de demanda y oferta.
No obstante, el escenario se modifica ligeramente en el tercer período, donde se prevé un descenso en las ventas hasta 11,053,018. Este ligero retroceso podría ser un indicativo de una disminución en la demanda o de la influencia de factores externos que afectan negativamente el volumen de ventas.
El cuarto período presenta retos más significativos, con una proyección de ventas que disminuye considerablemente a 9,495,208. Este notable declive señala la necesidad de revisar críticamente las estrategias de mercado y, posiblemente, adaptarse a un entorno competitivo más agresivo o a cambios en las preferencias de los consumidores.
Finalmente, el quinto período continúa con esta tendencia de decrecimiento, evidenciando una reducción adicional en las ventas. Este patrón sugiere un aumento en la competencia o una significativa disminución en la demanda, destacando la importancia de una estrategia empresarial flexible y proactiva para superar estos desafíos y fomentar un crecimiento renovado.
Estos pronósticos no solo proporcionan una visión de los posibles escenarios futuros, sino que también enfatizan la necesidad de adaptabilidad y proactividad en la planificación estratégica para mantener la relevancia y competitividad en un mercado dinámico.
Seleccionar información y datos que consideren relevantes para responder las preguntas de análisis.
** Base de Datos Maestra para Situación Problema 1**
Dado que la primera situación problema tiene un enfoque con base interna, es necesario utilizar las bases de datos relacionadas al area de capital humano para resolver este problema. Dado que hasta la fecha actual la empresa FORM unicamente ha proporcionado 2 bases de datos relacionadas a dicha problematica, actualmente solo se limpiaron y unificaron esas bases dividiendose en 2 bases maestras actualmente, FORM_Bajas y FORM_Satisfaccion, cada una teniendo un enfoque distinto. Además de esto, se descargo la base de datos official proporcionada por parte del Govierno de Mexico y de libre uso que incluye los poligonos para llevar a cabo un analisis espacial. De esta forma e integrando esta ultima base de datos, podríamos tener ambas bases listas para la creación de un modelo de clasificación.
** Base de Datos Maestra para Situación Problema 2**
Con respecto a las problematicas asociadas a la situación problema 2, actualmente no se cuenta con la data interna suficiente como para poder crear una base maestra lista que nos permita crear un modelo util y real que permita al socio formador predecir la demanda. A pesar de esto, contamos actualmente con una base de datos ligada al fenomeno de nearshoring, una base de datos unificada para la exportación e importación de materia prima y de las industrias manufactureras relacionadas que si bien no se han unificados todas las bases en 1, ya hay una base maestra para cada campo que se puede encontrar dentro de la carpeta de databases en este mismo repositorio. Una vez con datos más especificos de producción o venta compartidos por el socio formador, sería posible realizar lo solicitado y crear una base de datos maestra que unifique tanto los factores externos como interno.
Diseñar y organizar base(s) de datos a partir de la información y datos seleccionados.
Para abordar los desafíos asociados al capital humano, se propone la siguiente estructura y organización de las bases de datos:
Base de Datos FORM_Bajas: Esta base
se enfocará en recopilar información detallada sobre las bajas de
personal, incluyendo motivos de salida, fechas de baja, duración del
empleo, y cualquier dato relevante que pueda influir en la decisión de
dejar la empresa. Se buscará identificar patrones que puedan prevenir
futuras bajas.
Base de Datos FORM_Satisfaccion:
Contendrá resultados de encuestas de satisfacción laboral, feedback
sobre el ambiente laboral, oportunidades de crecimiento, balance entre
vida laboral y personal, y otros factores que afectan la satisfacción y
retención del personal. Esta base se utilizará para analizar
correlaciones entre satisfacción y productividad o permanencia en la
empresa.
Para ambas bases, se realizará un trabajo de limpieza de datos, normalización y unificación de formatos para asegurar coherencia y facilitar el análisis. Además, se integrará la base de datos de polígonos del Gobierno de México para realizar análisis espacial, permitiendo explorar la distribución geográfica de las bajas y la satisfacción del personal, y cómo estos factores pueden influir en la dinámica de trabajo.
La estructuración de la base de datos para esta situación problema se realizará de la siguiente manera:
Base de Datos de Nearshoring y Comercio Exterior: Incluirá datos sobre importaciones, exportaciones, tendencias de nearshoring, y cómo estos factores impactan en las industrias relevantes para la empresa. Se desglosará por tipo de producto, origen, destino, volumen y valor de las transacciones.
Base Maestra Integrada: A partir de los datos de nearshoring y comercio exterior, se buscará integrar esta información con datos internos de producción, ventas, y cualquier otro dato relevante proporcionado por el socio formador. Esta base maestra permitirá analizar la demanda desde una perspectiva interna y externa, facilitando la creación de modelos predictivos.
Para ambas situaciones, se adoptarán prácticas de gestión de datos que incluyen la indexación adecuada, la implementación de claves foráneas para mantener la integridad referencial, y la creación de vistas o tablas agregadas para análisis específicos. Además, se prestará especial atención a la seguridad y privacidad de los datos, asegurando que la información sensible sea manejada conforme a las normativas aplicables.
Visualizar en R los primeros 6 renglones de la nueva base de datos.
setwd("../databases")
bajas <- read_xlsx("form/form-bajas.xlsx")
head(bajas)
## # A tibble: 6 × 12
## `Motivo de Baja` Puesto Dpto SD `Estado Civil` Genero Año Estado
## <chr> <chr> <chr> <dbl> <chr> <chr> <dbl> <chr>
## 1 Separacion voluntaria ayudante… stab… 181. soltero femen… 2023 nuevo…
## 2 Separacion voluntaria ayudante… <NA> 181. casado femen… 2023 nuevo…
## 3 Separacion voluntaria gestor emba… 177. casado mascu… 2023 nuevo…
## 4 Separacion voluntaria ayudante… celd… 181. soltero femen… 2023 nuevo…
## 5 Separacion voluntaria ayudante… <NA> 181. casado femen… 2023 nuevo…
## 6 Separacion voluntaria soldador <NA> 181. soltero mascu… 2023 nuevo…
## # ℹ 4 more variables: Municipio <chr>, Dias_trabajados <dbl>, Meses <dbl>,
## # Edad <dbl>
setwd("../databases")
satis <- read_xlsx("form/Encuesta_Datos_FORM_Fall2023.xlsx")
head(satis)
## # A tibble: 6 × 22
## encuesta puesto antiguedad razon_entrada salario_bueno prestaciones_bueno
## <dbl> <chr> <dbl> <chr> <chr> <chr>
## 1 1 administra… 9 salario Totalmente d… Medianamente de a…
## 2 2 costurera 36 otro Medianamente… Medianamente de a…
## 3 3 ayudante g… 4 ubicacion em… Medianamente… Totalmente en des…
## 4 4 ayudante g… 2 ubicacion em… Totalmente d… Medianamente de a…
## 5 5 ayudante g… 1 ubicacion em… Ni de acuerd… Totalmente en des…
## 6 6 ayudante g… 36 razones pers… Medianamente… Totalmente de acu…
## # ℹ 16 more variables: jornada_no_excesiva <chr>,
## # ofrecimiento_herramientas <chr>, no_molestia_temperatura <chr>,
## # estres_bajo <chr>, facilidad_transporte <chr>, zona_trabajo_comoda <chr>,
## # permanencia_form_futuro <chr>, sufrido_situaciones_conflicto <chr>,
## # molestias_puesto <chr>, sentimiento_form <chr>, edad <chr>, genero <chr>,
## # estado_civil <chr>, municipio <chr>, nivel_escolar <chr>,
## # personas_dependientes <dbl>
setwd("../databases")
nearshoring <- read_xlsx("nearshoring/annual_economic_data.xlsx")
tail(nearshoring)
## # A tibble: 6 × 20
## Año IED_Flujos_Reales Exportaciones Educacion Salario_Diario Innovacion
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 2017 683139. 33323. 9.35 88.4 14.0
## 2 2018 670908. 35342. 9.45 88.4 13.2
## 3 2019 616010. 36415. 9.58 103. 12.7
## 4 2020 514583. 41077. 8.46 123. 11.3
## 5 2021 551831. 44915. 9.58 142. 15.1
## 6 2022 555904. 46478. 7.20 173. 11.3
## # ℹ 14 more variables: Inseguridad_Robo <dbl>, Inseguridad_Homicidio <dbl>,
## # Tipo_de_Cambio <dbl>, Densidad_Carretera <dbl>, Densidad_Poblacion <dbl>,
## # PIB_Per_Capita <dbl>, INPC <dbl>, Empleo <dbl>, CO2_Emisiones <dbl>,
## # Empresas_Extranjeras_Registradas <dbl>,
## # Población_Economicamente_Activa <dbl>,
## # Poblacion_ocupada_industria_manufacturera <dbl>, Poblacion_ocupada <dbl>,
## # Tasa_de_ocupacion_industria_manufacturera <dbl>
setwd("../databases")
export <- read_csv("industry_autos_mx/exportacion_vehiculos_mx.csv")
head(export)
## # A tibble: 6 × 7
## year year_quarter quarter state_id State trade_value region
## <dbl> <dbl> <chr> <dbl> <chr> <dbl> <chr>
## 1 2006 20061 2006-Q1 1 Aguascalientes 41467663 Centro-Norte
## 2 2006 20062 2006-Q2 1 Aguascalientes 68865388 Centro-Norte
## 3 2006 20063 2006-Q3 1 Aguascalientes 98879401 Centro-Norte
## 4 2006 20064 2006-Q4 1 Aguascalientes 172591417 Centro-Norte
## 5 2007 20071 2007-Q1 1 Aguascalientes 166572113 Centro-Norte
## 6 2007 20072 2007-Q2 1 Aguascalientes 167222076 Centro-Norte
Elaborar glosario de las variables que se incluyen en la nueva base de datos.
Elaboración de un glosario para las variables incluidas en las nuevas bases de datos, sin incluir el tipo de dato.
Desarrollar EDA que responda cada una de las preguntas de análisis.
setwd("../databases/")
datos <- read_excel("form/Encuesta_Datos_FORM_Fall2023.xlsx")
df = read_xlsx("form/temporary/BDD_FORM_BAJAS-2023.xlsx")
datos_num <- datos
datos_num[sapply(datos_num, is.factor)] <- lapply(datos_num[sapply(datos_num, is.factor)], as.numeric)
str(datos_num)
## tibble [106 × 22] (S3: tbl_df/tbl/data.frame)
## $ encuesta : num [1:106] 1 2 3 4 5 6 7 8 9 10 ...
## $ puesto : chr [1:106] "administrativo" "costurera" "ayudante general" "ayudante general" ...
## $ antiguedad : num [1:106] 9 36 4 2 1 36 36 36 36 1 ...
## $ razon_entrada : chr [1:106] "salario" "otro" "ubicacion empresa" "ubicacion empresa" ...
## $ salario_bueno : chr [1:106] "Totalmente de acuerdo" "Medianamente de acuerdo" "Medianamente en desacuerdo" "Totalmente de acuerdo" ...
## $ prestaciones_bueno : chr [1:106] "Medianamente de acuerdo" "Medianamente de acuerdo" "Totalmente en desacuerdo" "Medianamente de acuerdo" ...
## $ jornada_no_excesiva : chr [1:106] "Totalmente de acuerdo" "Totalmente de acuerdo" "Totalmente en desacuerdo" "Totalmente de acuerdo" ...
## $ ofrecimiento_herramientas : chr [1:106] "Totalmente de acuerdo" "Medianamente de acuerdo" "Totalmente en desacuerdo" "Totalmente de acuerdo" ...
## $ no_molestia_temperatura : chr [1:106] "Medianamente en desacuerdo" "Ni de acuerdo ni en desacuerdo" "Ni de acuerdo ni en desacuerdo" "Medianamente de acuerdo" ...
## $ estres_bajo : chr [1:106] "Totalmente de acuerdo" "Medianamente en desacuerdo" "Totalmente en desacuerdo" "Totalmente de acuerdo" ...
## $ facilidad_transporte : chr [1:106] "Medianamente de acuerdo" "Medianamente en desacuerdo" "Medianamente de acuerdo" "Totalmente de acuerdo" ...
## $ zona_trabajo_comoda : chr [1:106] "Totalmente de acuerdo" "Medianamente de acuerdo" "Medianamente de acuerdo" "Totalmente de acuerdo" ...
## $ permanencia_form_futuro : chr [1:106] "Medianamente de acuerdo" "Totalmente de acuerdo" "Totalmente en desacuerdo" "Medianamente de acuerdo" ...
## $ sufrido_situaciones_conflicto: chr [1:106] "No" "No" "Si" "No" ...
## $ molestias_puesto : chr [1:106] "cotizacion imss fecha pago comer 3pm" NA "trabajo estres" "bien" ...
## $ sentimiento_form : chr [1:106] "comodo contento" "comodo" "comoda contento" "comodo contento" ...
## $ edad : chr [1:106] "30" "54" "21" "20" ...
## $ genero : chr [1:106] "Femenino" "Femenino" "Femenino" "Femenino" ...
## $ estado_civil : chr [1:106] "Unión libre" "Casado" "Soltero" "Casado" ...
## $ municipio : chr [1:106] "Apodaca" "Apodaca" "Apodaca" "Apodaca" ...
## $ nivel_escolar : chr [1:106] "Licenciatura" "Primaria" "Preparatoria" "Preparatoria" ...
## $ personas_dependientes : num [1:106] 0 0 0 0 0 2 1 0 0 2 ...
summary(datos_num)
## encuesta puesto antiguedad razon_entrada
## Min. : 1.00 Length:106 Min. : 1.00 Length:106
## 1st Qu.: 27.25 Class :character 1st Qu.: 1.00 Class :character
## Median : 53.50 Mode :character Median : 9.00 Mode :character
## Mean : 53.50 Mean :14.08
## 3rd Qu.: 79.75 3rd Qu.:34.50
## Max. :106.00 Max. :36.00
## salario_bueno prestaciones_bueno jornada_no_excesiva
## Length:106 Length:106 Length:106
## Class :character Class :character Class :character
## Mode :character Mode :character Mode :character
##
##
##
## ofrecimiento_herramientas no_molestia_temperatura estres_bajo
## Length:106 Length:106 Length:106
## Class :character Class :character Class :character
## Mode :character Mode :character Mode :character
##
##
##
## facilidad_transporte zona_trabajo_comoda permanencia_form_futuro
## Length:106 Length:106 Length:106
## Class :character Class :character Class :character
## Mode :character Mode :character Mode :character
##
##
##
## sufrido_situaciones_conflicto molestias_puesto sentimiento_form
## Length:106 Length:106 Length:106
## Class :character Class :character Class :character
## Mode :character Mode :character Mode :character
##
##
##
## edad genero estado_civil municipio
## Length:106 Length:106 Length:106 Length:106
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
##
##
##
## nivel_escolar personas_dependientes
## Length:106 Min. :0.000
## Class :character 1st Qu.:0.000
## Mode :character Median :1.000
## Mean :1.085
## 3rd Qu.:2.000
## Max. :3.000
describe(datos_num)
## vars n mean sd median trimmed mad min
## encuesta 1 106 53.50 30.74 53.5 53.50 39.29 1
## puesto* 2 106 4.84 4.12 3.0 4.27 2.97 1
## antiguedad 3 106 14.08 14.47 9.0 13.05 11.86 1
## razon_entrada* 4 106 4.00 1.83 4.0 4.12 2.97 1
## salario_bueno* 5 106 2.83 1.49 3.0 2.79 1.48 1
## prestaciones_bueno* 6 106 3.12 1.46 4.0 3.15 1.48 1
## jornada_no_excesiva* 7 106 3.33 1.26 4.0 3.43 0.00 1
## ofrecimiento_herramientas* 8 106 3.64 1.23 4.0 3.79 0.00 1
## no_molestia_temperatura* 9 106 3.69 1.35 4.0 3.85 1.48 1
## estres_bajo* 10 106 3.17 1.33 4.0 3.21 1.48 1
## facilidad_transporte* 11 106 4.04 1.48 5.0 4.28 0.00 1
## zona_trabajo_comoda* 12 106 3.43 1.23 4.0 3.56 0.00 1
## permanencia_form_futuro* 13 106 3.25 1.29 4.0 3.33 0.00 1
## sufrido_situaciones_conflicto* 14 106 1.31 0.72 1.0 1.15 0.00 1
## molestias_puesto* 15 88 30.70 19.56 28.5 29.97 27.43 1
## sentimiento_form* 16 106 13.51 10.12 7.0 12.01 4.45 1
## edad* 17 106 17.41 11.63 15.5 16.88 14.08 1
## genero* 18 106 1.35 0.48 1.0 1.31 0.00 1
## estado_civil* 19 106 2.46 1.16 3.0 2.45 1.48 1
## municipio* 20 106 1.76 1.42 1.0 1.43 0.00 1
## nivel_escolar* 21 106 3.42 1.58 3.0 3.51 2.97 1
## personas_dependientes 22 106 1.08 1.10 1.0 0.99 1.48 0
## max range skew kurtosis se
## encuesta 106 105 0.00 -1.23 2.99
## puesto* 14 13 1.11 -0.23 0.40
## antiguedad 36 35 0.61 -1.36 1.41
## razon_entrada* 6 5 -0.38 -1.37 0.18
## salario_bueno* 5 4 -0.12 -1.62 0.14
## prestaciones_bueno* 5 4 -0.23 -1.42 0.14
## jornada_no_excesiva* 5 4 -0.95 -0.52 0.12
## ofrecimiento_herramientas* 5 4 -1.20 0.38 0.12
## no_molestia_temperatura* 5 4 -0.89 -0.44 0.13
## estres_bajo* 5 4 -0.50 -1.03 0.13
## facilidad_transporte* 5 4 -1.20 -0.23 0.14
## zona_trabajo_comoda* 5 4 -1.16 -0.12 0.12
## permanencia_form_futuro* 5 4 -0.79 -0.75 0.13
## sufrido_situaciones_conflicto* 3 2 1.87 1.56 0.07
## molestias_puesto* 67 66 0.26 -1.29 2.09
## sentimiento_form* 40 39 1.18 0.13 0.98
## edad* 40 39 0.33 -1.24 1.13
## genero* 2 1 0.62 -1.63 0.05
## estado_civil* 4 3 -0.23 -1.51 0.11
## municipio* 6 5 1.73 1.75 0.14
## nivel_escolar* 5 4 -0.42 -1.33 0.15
## personas_dependientes 3 3 0.48 -1.18 0.11
Cálculo de medidas de dispersión para cada variable numérica relevante
sapply(datos_num, var, na.rm = TRUE) # Varianza
## encuesta puesto
## 945.166667 NA
## antiguedad razon_entrada
## 209.422821 NA
## salario_bueno prestaciones_bueno
## NA NA
## jornada_no_excesiva ofrecimiento_herramientas
## NA NA
## no_molestia_temperatura estres_bajo
## NA NA
## facilidad_transporte zona_trabajo_comoda
## NA NA
## permanencia_form_futuro sufrido_situaciones_conflicto
## NA NA
## molestias_puesto sentimiento_form
## NA NA
## edad genero
## 148.990293 NA
## estado_civil municipio
## NA NA
## nivel_escolar personas_dependientes
## NA 1.202246
sapply(datos_num, sd, na.rm = TRUE) # Desviación estándar
## encuesta puesto
## 30.74356 NA
## antiguedad razon_entrada
## 14.47145 NA
## salario_bueno prestaciones_bueno
## NA NA
## jornada_no_excesiva ofrecimiento_herramientas
## NA NA
## no_molestia_temperatura estres_bajo
## NA NA
## facilidad_transporte zona_trabajo_comoda
## NA NA
## permanencia_form_futuro sufrido_situaciones_conflicto
## NA NA
## molestias_puesto sentimiento_form
## NA NA
## edad genero
## 12.20616 NA
## estado_civil municipio
## NA NA
## nivel_escolar personas_dependientes
## NA 1.09647
Cálculo del rango intercuartílico para cada variable numérica relevante
sapply(datos_num, IQR, na.rm = TRUE)
## encuesta puesto
## 52.5 NA
## antiguedad razon_entrada
## 33.5 NA
## salario_bueno prestaciones_bueno
## NA NA
## jornada_no_excesiva ofrecimiento_herramientas
## NA NA
## no_molestia_temperatura estres_bajo
## NA NA
## facilidad_transporte zona_trabajo_comoda
## NA NA
## permanencia_form_futuro sufrido_situaciones_conflicto
## NA NA
## molestias_puesto sentimiento_form
## NA NA
## edad genero
## 20.0 NA
## estado_civil municipio
## NA NA
## nivel_escolar personas_dependientes
## NA 2.0
ggplot(datos, aes(x = reorder(puesto, estres_bajo, FUN = median), y = estres_bajo)) +
geom_bar(stat = "summary", fun = "median", fill = "orange", color = "black") +
coord_flip() + # Invertir ejes para tener los puestos en el eje y y las barras extendiéndose horizontalmente
theme_minimal() +
labs(title = "Nivel de Estrés con base en Media por Puesto de Trabajo",
y = "Nivel de Estrés Mediano",
x = "Puesto") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
En esta gráfica de barras podemos observar diferentes puestos de trabajo y su correspondiente nivel mediano de estrés.
Los puestos con niveles más altos de estrés parecen ser soldador,otro, y operador. Un hallazgo importante es que estos puestos pueden tener condiciones de trabajo que generan un alto nivel de estrés, lo que podría estar contribuyendo a la rotación de personal. La empresa FORM podría enfocarse en mejorar las condiciones de trabajo en estos puestos, tal vez automatizando tareas estresantes o proporcionando más apoyo y descansos.
Los puestos con menores niveles de estrés son asistente de producción,embarque, y mantenimiento, lo que podría indicar que estas áreas son menos propensas a experimentar rotación debido al estrés laboral.
antiguedad_por_salario <- datos %>%
group_by(salario_bueno) %>%
summarise(antiguedad_promedio = mean(antiguedad, na.rm = TRUE)) %>%
arrange(desc(antiguedad_promedio))
# Definir una paleta de colores personalizada
colores_personalizados <- c('Totalmente de acuerdo' = '#AED6F1', # Claro
'Medianamente de acuerdo' = '#5DADE2', # Intermedio claro
'Ni de acuerdo ni en desacuerdo' = '#3498DB', # Neutro
'Medianamente en desacuerdo' = '#2874A6', # Intermedio oscuro
'Totalmente en desacuerdo' = '#1B4F72') # Oscuro
# Gráfico de barras de la antigüedad promedio por satisfacción con el salario, usando colores personalizados
ggplot(antiguedad_por_salario, aes(x = salario_bueno, y = antiguedad_promedio, fill = salario_bueno)) +
geom_bar(stat = "identity") +
scale_fill_manual(values = colores_personalizados) + # Usa la paleta de colores personalizada
coord_flip() +
theme_minimal() +
labs(title = "Antigüedad Promedio por Satisfacción con el Salario",
x = "Satisfacción con el Salario",
y = "Antigüedad Promedio (años)"
)
Esta gráfica de barras verticales ilustra la relación entre la antigüedad promedio en la empresa y el grado de satisfacción con el salario. Se observa una correlación positiva entre la antigüedad y la satisfacción salarial, destacando que los empleados que están totalmente satisfechos con su salario tienden a tener una mayor antigüedad, específicamente entre 15 a 20 años.
Este patrón sugiere que la satisfacción salarial incrementa con el tiempo de servicio en la empresa. Esto podría interpretarse como una señal de que los aumentos salariales o bonificaciones basadas en la antigüedad son efectivos, o bien, que los empleados de mayor antigüedad ocupan puestos con mejor remuneración, posiblemente debido a ascensos o incrementos salariales vinculados a su desempeño a lo largo de los años.
Ante estos hallazgos, se recomienda a la empresa FORM considerar modificaciones en su estructura salarial para incrementar la satisfacción salarial entre los empleados de menor antigüedad. Tal ajuste podría contribuir a reducir la rotación de personal, fomentando un ambiente laboral más estable y comprometido.
datos %>%
group_by(puesto, no_molestia_temperatura) %>%
summarise(count = n()) %>%
ggplot(aes(x = puesto, y = count, fill = no_molestia_temperatura)) +
geom_bar(stat = "identity", position = "dodge") +
labs(title = "Percepción de Molestia por la Temperatura por Puesto",
x = "Puesto",
y = "Cantidad",
fill = "No Molesta la Temperatura") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
Hemos observado una notable incomodidad con la temperatura por parte de los ayudantes generales, lo cual requiere que tomemos medidas para regular el clima en el espacio donde desempeñan sus labores. Esta situación no parece ser tan pronunciada en otras áreas.
datos %>%
group_by(puesto, permanencia_form_futuro) %>%
summarise(count = n()) %>%
filter(permanencia_form_futuro != "Totalmente de acuerdo" & permanencia_form_futuro != "Medianamente de acuerdo") %>%
ggplot(aes(x = reorder(puesto, -count), y = count, fill = permanencia_form_futuro)) +
geom_bar(stat = "identity") +
coord_flip() +
labs(title = "Disconformidad por Puesto",
x = "Puesto",
y = "Cantidad de Disconformidad") +
theme_minimal()
datos$antiguedad_rango <- cut(datos$antiguedad, breaks = seq(0, max(datos$antiguedad, na.rm = TRUE) + 5, by = 5), right = FALSE, labels = paste(seq(0, max(datos$antiguedad, na.rm = TRUE), by = 5), seq(5, max(datos$antiguedad, na.rm = TRUE) + 5, by = 5) - 1, sep = "-"))
datos %>%
group_by(antiguedad_rango, estres_bajo) %>%
summarise(count = n()) %>%
ggplot(aes(x = antiguedad_rango, y = count, fill = estres_bajo)) +
geom_bar(stat = "identity", position = "dodge") +
labs(title = "Percepción del Estrés por Rangos de Antigüedad",
x = "Rango de Antigüedad",
y = "Cantidad",
fill = "Percepción de Bajo Estrés") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
Contamos con indicios sólidos de que el estrés no constituye un factor adverso para nuestros trabajadores. Observamos que la mayoría, sin importar su tiempo de servicio en la empresa, reporta experimentar un nivel bajo de estrés en sus actividades laborales.
datos %>%
group_by(puesto, prestaciones_bueno) %>%
summarise(count = n()) %>%
ggplot(aes(x = puesto, y = count, fill = prestaciones_bueno)) +
geom_bar(stat = "identity", position = "dodge") +
labs(title = "Percepción de Prestaciones por Puesto",
x = "Puesto",
y = "Cantidad",
fill = "Hay Buenas Prestaciones") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
Observamos que entre los ayudantes generales se concentra la mayor cantidad de respuestas en nuestra base de datos, lo cual indica que este grupo es el más numeroso. Dentro de este colectivo, las opiniones sobre las prestaciones ofrecidas por la empresa son variadas. Este fenómeno sugiere que los ayudantes generales no están completamente satisfechos con las prestaciones que reciben; de lo contrario, no observaríamos tal diversidad en las respuestas.
Por tanto, se puede concluir que una de las principales áreas de mejora para la empresa reside en el trato hacia los ayudantes generales, quienes expresan descontento principalmente con la temperatura en su lugar de trabajo y perciben que las prestaciones que reciben no son adecuadas. Esta situación podría estar contribuyendo a la alta rotación observada en este sector de la empresa.
summary(df)
## No. Apellidos Nombre Fecha de Nacimiento
## Min. :1.000 Length:279 Length:279 Min. :23715
## 1st Qu.:1.000 Class :character Class :character 1st Qu.:31334
## Median :1.000 Mode :character Mode :character Median :35103
## Mean :1.022 Mean :33817
## 3rd Qu.:1.000 3rd Qu.:36932
## Max. :4.000 Max. :44865
##
## Género RFC Fecha de Alta Primer Mes
## Length:279 Length:279 Min. :43070 Min. :43100
## Class :character Class :character 1st Qu.:44936 1st Qu.:44966
## Mode :character Mode :character Median :45003 Median :45033
## Mean :44970 Mean :45001
## 3rd Qu.:45098 3rd Qu.:45128
## Max. :45161 Max. :45191
##
## Cuarto Mes Fecha de Baja Motivo de Baja Puesto
## Min. :43190 Min. :44928 Length:279 Length:279
## 1st Qu.:45058 1st Qu.:45001 Class :character Class :character
## Median :45125 Median :45078 Mode :character Mode :character
## Mean :45092 Mean :45063
## 3rd Qu.:45220 3rd Qu.:45124
## Max. :45283 Max. :45166
##
## Dpto Imss SD
## Length:279 Length:279 Length:279
## Class :character Class :character Class :character
## Mode :character Mode :character Mode :character
##
##
##
##
## Factor de Crédito Infonavit No. De Crédito Infonavit CURP
## Length:279 Length:279 Length:279
## Class :character Class :character Class :character
## Mode :character Mode :character Mode :character
##
##
##
##
## Calle Número Colonia Municipio
## Length:279 Length:279 Length:279 Length:279
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
##
##
##
##
## Estado CP Estado Civil Número de Télefono
## Length:279 Min. :25115 Length:279 Min. :8.320e+07
## Class :character 1st Qu.:66646 Class :character 1st Qu.:8.118e+09
## Mode :character Median :66646 Mode :character Median :8.129e+09
## Mean :65419 Mean :7.989e+09
## 3rd Qu.:66652 3rd Qu.:8.136e+09
## Max. :99999 Max. :9.841e+09
## NA's :12
df <- df %>%
mutate(Dpto = if_else(Dpto == "Produccion Cartón MC", "Producción Cartón MC", Dpto))
bajas_por_departamento <- df %>%
group_by(Dpto) %>%
summarise(Total_Bajas = n())
ggplot(bajas_por_departamento, aes(x = reorder(Dpto, -Total_Bajas), y = Total_Bajas, fill = Dpto)) +
geom_bar(stat = "identity") +
theme_minimal() +
labs(title = "Bajas por Departamento", x = "Departamento", y = "Total de Bajas")
bajas_por_departamento <- df %>%
group_by(Dpto) %>%
summarise(Total_Bajas = n()) %>%
filter(Total_Bajas > 1)
# Ordenamos las bajas por departamento de mayor a menor en el gráfico
ggplot(bajas_por_departamento, aes(x = reorder(Dpto, -Total_Bajas), y = Total_Bajas, fill = Dpto)) +
geom_bar(stat = "identity") +
theme_minimal() +
labs(title = "Bajas por Departamento (Filtrado)", x = "Departamento", y = "Total de Bajas")
bajas_por_departamento_genero <- df %>%
group_by(Dpto, Género) %>%
summarise(Total_Bajas = n())
ggplot(bajas_por_departamento_genero, aes(x = reorder(Dpto, -Total_Bajas), y = Total_Bajas, fill = Género)) +
geom_bar(stat = "identity", position = "dodge") +
theme_minimal() +
labs(title = "Bajas por Departamento y Género", x = "Departamento", y = "Total de Bajas")
bajas_por_departamento_genero <- df %>%
group_by(Dpto, Género) %>%
summarise(Total_Bajas = n()) %>%
filter(Total_Bajas > 1)
ggplot(bajas_por_departamento_genero, aes(x = reorder(Dpto, -Total_Bajas), y = Total_Bajas, fill = Género)) +
geom_bar(stat = "identity", position = "dodge") +
theme_minimal() +
labs(title = "Bajas por Departamento y Género (Filtrado)", x = "Departamento", y = "Total de Bajas")
bajas_por_motivo_genero <- df %>%
group_by(`Motivo de Baja`, Género) %>%
summarise(Total_Bajas = n())
ggplot(bajas_por_motivo_genero, aes(x = `Motivo de Baja`, y = Total_Bajas, fill = Género)) +
geom_bar(stat = "identity", position = "dodge") +
theme_minimal() +
labs(title = "Bajas por Motivo y Género", x = "Motivo de Baja", y = "Total de Bajas") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
Las gráficas muestran que los departamentos de Producción de Cartón, tanto MC como ML, registran el mayor número de bajas en la empresa. Este dato resalta la existencia de un problema significativo en estas áreas, subrayando la urgencia de investigar las causas subyacentes para implementar estrategias correctivas adecuadas.
Además, es notable que, de las 18 personas que dejaron la empresa, 17 fueran mujeres. Este desproporcionado impacto sobre las trabajadoras sugiere la presencia de un problema serio relacionado con cuestiones de género. Identificar y abordar las dinámicas o condiciones laborales que puedan estar contribuyendo a esta situación es crucial para crear un entorno de trabajo más inclusivo y equitativo.
df$`Fecha de Baja` <- as.Date(df$`Fecha de Baja`, origin = "1899-12-30")
df$AñoMes <- format(df$`Fecha de Baja`, "%Y-%m")
bajas_por_fecha <- df %>%
group_by(AñoMes) %>%
summarise(Total_Bajas = n())
ggplot(bajas_por_fecha, aes(x = AñoMes, y = Total_Bajas, group = 1)) +
geom_line() +
geom_point() +
theme_minimal() +
labs(title = "Tendencia de Bajas a lo Largo del Tiempo", x = "Año y Mes", y = "Total de Bajas") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
df$`Fecha de Baja` <- as.Date(df$`Fecha de Baja`, origin = "1899-12-30")
bajas_por_mes <- df %>%
mutate(Mes = format(`Fecha de Baja`, "%B")) %>%
group_by(Mes) %>%
summarise(Total_Bajas = n())
meses <- format(seq(as.Date("2000-01-01"), as.Date("2000-12-01"), by = "month"), "%B")
bajas_por_mes$Mes <- factor(bajas_por_mes$Mes, levels = meses)
# Ahora ordenamos los datos para el gráfico
bajas_por_mes <- bajas_por_mes %>%
mutate(Mes = reorder(Mes, -Total_Bajas))
# Gráfico de barras mostrando las bajas totales por mes, ordenadas de mayor a menor
ggplot(bajas_por_mes, aes(x = Mes, y = Total_Bajas, fill = Mes)) +
geom_bar(stat = "identity") +
theme_minimal() +
labs(title = "Bajas Totales por Mes Ordenadas", x = "Mes", y = "Total de Bajas")
A pesar de la ausencia de datos de marzo a mayo, la evidencia sugiere que no se registraron bajas en la empresa durante ese periodo. Sin embargo, se observa un notable aumento en las bajas en junio, lo cual es significativo y merece una exploración detallada. Este incremento podría estar vinculado a factores legales relacionados con contratos o, posiblemente, estar asociado a problemas específicos en el área de producción de cartón, dado que la mayoría de las bajas ese mes se atribuyen a esta última razón.
Es imperativo llevar a cabo un análisis más profundo para comprender con mayor precisión las causas subyacentes de este fenómeno. Dicho análisis ayudará a identificar las áreas críticas de intervención y a desarrollar estrategias efectivas para prevenir futuras bajas en estos departamentos críticos.
bajas_por_estado_civil <- df %>%
group_by(`Estado Civil`) %>%
summarise(Total_Bajas = n()) %>%
mutate(`Estado Civil` = reorder(`Estado Civil`, -Total_Bajas))
ggplot(bajas_por_estado_civil, aes(x = `Estado Civil`, y = Total_Bajas, fill = `Estado Civil`)) +
geom_bar(stat = "identity") +
theme_minimal() +
labs(title = "Bajas por Estado Civil", x = "Estado Civil", y = "Total de Bajas") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
Se destaca claramente que las personas solteras presentan una mayor tasa de bajas en la empresa. Este patrón podría deberse a la menor cantidad de responsabilidades familiares o dependientes económicos, lo que les otorga mayor flexibilidad para tomar decisiones sobre su carrera profesional sin tener que considerar el impacto en otros miembros de una familia.
Las 2 tendencias de las emociones son: Positiva o Negativa
# Función ajustada para preprocesar texto
preparar_texto <- function(datos, columna) {
datos %>%
select(!!sym(columna)) %>%
mutate(across(everything(), as.character)) %>%
mutate(across(everything(), ~ gsub("\\d+", "", .))) %>%
unnest_tokens(word, !!sym(columna))
}
# Función ajustada para análisis de sentimiento y wordcloud
analizar_y_wordcloud <- function(datos, columna) {
texto_preparado <- preparar_texto(datos, columna)
# Obtener sentimiento
emociones_df <- texto_preparado %>%
inner_join(get_sentiments("nrc"), by = "word") %>%
count(sentiment, sort = TRUE) %>%
print()
# Filtrar palabras para el wordcloud (aparición mínima: 3 veces)
palabras_frecuentes <- texto_preparado %>%
count(word, sort = TRUE) %>%
filter(n >= 3)
# Generar wordcloud
set.seed(123)
wordcloud(words = palabras_frecuentes$word, freq = palabras_frecuentes$n, min.freq = 2,
max.words = 100, random.order = FALSE, rot.per = 0.35,
colors = brewer.pal(8, "Dark2"))
}
analizar_y_wordcloud(datos, "razon_entrada")
## # A tibble: 0 × 2
## # ℹ 2 variables: sentiment <chr>, n <int>
analizar_y_wordcloud(datos, "molestias_puesto")
## # A tibble: 2 × 2
## sentiment n
## <chr> <int>
## 1 trust 3
## 2 negative 2
analizar_y_wordcloud(datos, "sentimiento_form")
## # A tibble: 2 × 2
## sentiment n
## <chr> <int>
## 1 trust 2
## 2 positive 1
El análisis del sentimiento general revela una actitud positiva dentro de la empresa, probablemente influenciada por el método de recolección de datos utilizado, que se basó en una pregunta abierta respondida por los colaboradores. Se sugiere que este formato puede hacer que sea más difícil para los empleados expresar sentimientos negativos de forma concisa, en tan solo tres palabras, lo que podría llevar a una representación más positiva del ambiente laboral en los resultados del análisis.
ts_plot(Ventas)
La interpretación comprensiva de los hallazgos revela una complejidad subyacente en la percepción y realidades del ambiente laboral en la empresa FORM. A pesar de la aparente actitud positiva general, se identifican desafíos específicos y oportunidades de mejora. Principales insights y recomendaciones incluyen:
Estas recomendaciones apuntan a fortalecer el ambiente laboral en FORM, abordando tanto los desafíos identificados como aprovechando las áreas de fortaleza para fomentar un entorno más positivo y productivo.
Para poder tener un Análisis Exploratorio de los Datos completo, debemos de desarrollar soluciones efectivas a los problemas de la empresa, principalmente en la rotación de personal y la predicción de la demanda en producción es por eso que pediríamos información como:
Información detallada sobre las bases de datos, como base de datos completa de personal. También, en la base de datos de ventas incluir más información, ya que cuenta con NA, lo que hace complicaciones en el análisis, que no podamos trabajar con muy pocos datos y eso limita nuestro trabajo para poder seguir identificando hallazgos importantes para la empresa
Data de encuestas de bajas, sobre todo incluyendo las razones de la renuncia para poder detectar diferentes tendencias y patrones.
Un Análisis Demográfico para saber datos de la edad, género, situación familiar y ubicación geográfica de los empleados para poder relacionar patrones con la rotación que existe en FORM.
De forma más simple, los datos explicitos más necesarios son: - BASE DATOS COMPLETA DE PERSONAL - DATA DE ENCUESTAS DE RAZON DE BAJAS - DATA DE TIEMPOS DE INVENTARIO - DATA DE DESGLOSE DE VENTA DE UNIDADES POR CLIENTE / O POR TIPO DE PARTE
Para complementar el EDA, con información de fuentes externas, buscamos información en:
Informes de la Industria (Statista) debido a que nos proporciona estadísticas globales sobre la industria automotriz. incluyendo las tendencias tecnológicas.
Estudios sobre el mercado de los empaques (Smithers) publican análisis de tendencias e informes de mercado de los empaques que se utilizan en el sector automotriz.
Datos de Comercio Internacional y económicos (Banco Mundial) para los datos de tarifas y economía global que afectan el comercio de los empaques
(Hoovers) para un Análisis de Competencia, donde se ofrecen datos importantes sobre las empresas y un análisis detallado de competidores en la industria de empaques.
Para tener un análisis más detallado buscamos información en diferentes fuentes:
1. Crecimiento del Sector Automotriz, en el 2024 se espera que la cifra de vehículos comercializados en México incremente en un 8% y esto representa 100 mil unidades más que en el 2023. En 2023 tuvo un crecimiento del 24.4% en vehículos comercializados comparado con el 2022. (Mexico Industry, 2024). Estos datos son un potencial aumento de demanda en los empaques de autopartes lo que es un impacto positivo para FORM.
2. Impacto en la electromovilidad, ya que existe una transición hacia la electromovilidad y esto genera una oportunidad para la creación de empleos y la demanda de competencias especializadas, esto impacta e influye de manera significativa a la demanda de empaques para los autopartes y componentes electrónicos y sistemas avanzados en los automóviles.
##Referencias
#1. D&B Hoovers is Your Sales Accelerator – Dun & Bradstreet. (s. f.). Recuperado 16 de marzo de 2024, de https://www.dnb.com/products/dnb-hoovers.html
#2. World Bank Group - International Development, Poverty, & Sustainability. (s. f.). World Bank. Recuperado 16 de marzo de 2024, de https://www.worldbank.org/en/home
#3. Smithers - Innovate with confidence. (s. f.). Smithers. Recuperado 16 de marzo de 2024, de https://www.smithers.com/home
#4. Statista. (s. f.). Statista - the statistics portal. Recuperado 16 de marzo de 2024, de https://www.statista.com/
#5. MexicoIndustry. (s. f.). Incrementará 8% el sector automotriz en 2024*. MexicoIndustry. Recuperado 16 de marzo de 2024, de https://mexicoindustry.com/noticia/incrementara-8-el-sector-automotriz-en-2024
#6. Newsroom Infobae. (2023, 12 abril). Industria automotriz en México espera más empleos por electromovilidad. Infobae*. Recuperado 16 de marzo de 2024, de https://www.infobae.com/america/agencias/2023/04/12/industria-automotriz-en-mexico-espera-mas-empleos-por-electromovilidad/